import pandas as pd
import time
import os

def crawler_weather(y, m):
    global success_cnt, all_data

    url = base_url + y + m + '.html'
    print(f"正在处理: {y}-{m}")

    try:
        tables = pd.read_html(url)
        time.sleep(1)

        if tables:
            df = tables[0]
            df = df.dropna(axis=1, how='all')
            df = df.dropna(how='all')
            if len(df.columns) == 4:
                df.columns = ['日期', '天气状况', '气温', '风力风向']
            if not df.empty:
                # 拆分字段
                df[['白天天气', '夜间天气']] = df['天气状况'].str.split('/', expand=True)
                df[['最高气温', '最低气温']] = df['气温'].str.split('/', expand=True)
                df[['白天风力风向', '夜间风力风向']] = df['风力风向'].str.split('/', expand=True)

                # 气温提取
                df['最高气温'] = df['最高气温'].str.replace(' ', '').str.extract(r'(-?\d+)℃')[0].astype(float)
                df['最低气温'] = df['最低气温'].str.replace(' ', '').str.extract(r'(-?\d+)℃')[0].astype(float)

                # 日期处理
                df['日期'] = pd.to_datetime(
                    df['日期'].str.replace('[年月日]', '-', regex=True).str.rstrip('-'),
                    errors='coerce'
                )

                df['月份'] = f"{y}-{m}"
                df = df[
                    ['日期', '月份', '白天天气', '夜间天气', '最高气温', '最低气温', '白天风力风向', '夜间风力风向']]
                all_data.append(df)

                csv_filename = f'../weather/csv/table_dalian_{y}_{m}.csv'
                df.to_csv(csv_filename, index=False, encoding='utf-8-sig')
                print(f"已保存: {csv_filename}")
                success_cnt += 1
            else:
                print(f"警告: {y}-{m} 页面未找到表格")
        else:
            print(f"错误: 无法获取 {y}-{m} 数据 (状态码: {r.status_code})")

    except Exception as e:
        print(f"处理 {y}-{m} 时出错: {str(e)}")


def main():
    if not os.path.exists('csv'):
        os.makedirs('csv')

    if not os.path.exists('images'):
        os.makedirs('images')

    global success_cnt, all_data, base_url

    base_url = 'https://www.tianqihoubao.com/lishi/dalian/month/'

    year = ['2022', '2023', '2024']
    month = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
    month_2025 = ['01', '02', '03', '04', '05', '06']

    success_cnt = 0
    all_data = []

    # 爬取2022-2024年数据
    for yy in year:
        for mm in month:
            crawler_weather(yy, mm)

    total_requests = len(year) * len(month)
    print(f"2022-2024年成功{success_cnt}次，成功率{success_cnt / total_requests:.2%}")

    # 合并所有月份数据
    if all_data:
        dff = pd.concat(all_data, ignore_index=True)
        dff.to_csv('csv/dalian_weather_2022-2024_full.csv', index=False, encoding='utf-8-sig')
        print("2022-2024年数据已合并保存为 dalian_weather_2022-2024_full.csv")
    else:
        print("未获取到2022-2024年数据")

    # 重置变量
    success_cnt = 0
    all_data = []

    # 单独爬取2025年的数据
    for mm in month_2025:
        crawler_weather('2025', mm)

    # 保存2025年数据
    if all_data:
        dff_2025 = pd.concat(all_data, ignore_index=True)
        dff_2025.to_csv('csv/dalian_weather_2025.csv', index=False, encoding='utf-8-sig')
        print("2025年数据已单独保存")
    else:
        print("未获取到2025年数据")


if __name__ == '__main__':
    main()